package com.ddone.demo.controller;

import com.ddone.demo.bean.Student;
import com.ddone.demo.bean.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

/**
 * @author ddone
 * @date 2024/3/22-08:46
 */
@Controller
@Slf4j
@RequestMapping("param")
public class ParamController {
    /*
     * 接单一值！
     *   url:  /param/test?username=root&password=123&age=18
     * TODO: 接收参数，一定是形参列表！
     *       响应数据，一定是方法返回值！
     * 方案：
     *      1.直接在形参列表声明对应类型的 对应名称的变量即可 [请求参数名 == 形参变量名]
     *        参数可以传，可以不传！ 不传为null！
     *        不能要求是否必须传递，业务无法设置默认值
     *
     *      2.请求参数和形参列表不一致 @RequestParam() 指定形参对应的请求参数名
     *        一旦指定了name，只认对应的请求参数名！ 不认形参名！
     *        @RequestParam以后，默认必须传递！ required = true   400 bad request
     *     3. 必须传参数问题
     *        1.不加注解 随意
     *        2.添加注解 默认必须传 ， required为false不传递！ 不传值 为null！
     *     4. 默认值
     *        默认值生效： 1. required = false
     *                    2. 前端真的没有传递参数
     *          @RequetParam(value="",required=false,defaultValue="默认值")
     */

    @RequestMapping("/test")
    public String test(String username, String password, int age) {
        log.warn("username: " + username + " password: " + password + " age: " + age);
        log.warn("ParamController.test");
        return "hello";
    }

    /**
     * 1.前端不一定给我们传分页数据， 例如： 第一页！ 不传页容量， 默认 6条！
     * 2.前端传递的当前页 cp 页容量变量 ps
     * /param/page?cp=2&ps=10
     * /param/page?cp=4
     */
    @RequestMapping("/page")
    public String page(@RequestParam(value = "cp", required = false, defaultValue = "1") int currentPage,
                       @RequestParam(value = "ps", required = false, defaultValue = "6") int pageSize) {
        log.warn("currentPage: " + currentPage + " pageSize: " + pageSize);
        log.warn("ParamController.page");
        return "hello";
    }


    /**
     * 前端会传递： 账号 密码 以及 性别
     * username password  sex
     * 账号和密码必须有值！ 账号 account 密码 password  sex
     * 性别：可以不传递，默认是 女
     *
     * @param account
     * @param password
     * @param sex
     * @return /param/register, {username:ddone,password:abc123,sex=:E7%94%B7'}
     */
    @GetMapping("/register")
    public String register(@RequestParam("username") String account,
                           @RequestParam("password") String password,
                           @RequestParam(value = "sex", required = false, defaultValue = "女") String sex) {
        log.warn("account: " + account + " password: " + password + " sex: " + sex);
        log.warn("ParamController.register");
        return "hello";
    }

    /**
     * TODO: 碰到集合值，使用集合直接接即可！
     *  多值： 前端传递一个 hbs爱好集合！  hbs=吃  hbs=喝  hbs=玩  hbs=乐
     *
     * @return /param/saveHbs?hbs=吃&hbs=喝&hbs=玩&hbs=乐
     */
    @GetMapping("/saveHbs")
    public String saveHobbies(@RequestParam("hbs") List<String> hobbies) {

        log.warn("hobbies: " + hobbies);
        //  [hobbies: [吃, 喝, 玩, 乐]]
        log.warn("ParamController.saveHobbies");
        return "hello";
    }

        /*

     # 1.直接在形参列表声明实体类对象即可
     # 2.要求参数名必须等于实体类名方可赋值
     # 3.不存在属性映射请求参数注解
     # 4.默认值的话直接在实体类的属性上声明即可
/*
 * TODO: 使用实体类接收参数
 *       只需要在形参列表，声明对应类型的实体类参数即可！
 *       要求： 请求参数名 必须 等于实体类属性名
 *              无法设置必须传入，也没有注解可以设置属性和请求参数名对应
 *              如果想要设置默认值： 直接在实体类声明属性赋值！
 *       总结： 实体类就是包裹了多个散装的属性而已！ 和单一接法一致！
 */

    @PostMapping("/register")
    public String registBean(User user) {
        log.warn("user=" + user);
        log.warn("RestUserController.registBean");
        return "login";
    }

    /**
     * Student
     * name
     * address
     * province
     * city
     * schools
     * school
     * name
     * address
     * province
     * city
     * scores
     * map
     * <p>
     * name: http key: name = "驴蛋蛋"
     * //级联
     * address: http key:  address.pro = "辽宁省"
     * address.city = "葫芦岛市"
     * //级联 集合 数组 set
     * schools: http key:  schools[0].name = "希望小学"
     * schools[0].location="赵孤家子屯"
     * schools[1].name = "希望中学"
     * schools[1].location = "高领镇"
     * scores: http key: scores['key']  = "值"    map 的 value
     * scores['java'] = 50
     * scores['h5'] = 100
     * scores['php'] = 12
     */
    @PostMapping("/save/student")
    public String saveStudent(Student student) {
        log.warn("UrlPathController.student");
        log.warn("student: " + student);
        return "hello";
    }
}
